package com.obelisco.modelo.dao.hibernate;

import java.io.Serializable;
import java.util.List;
import java.util.ResourceBundle;

import org.hibernate.validator.ClassValidator;
import org.hibernate.validator.InvalidValue;

import com.obelisco.exception.ObeliscoException;
import com.obelisco.modelo.dao.IUsuarioDAO;
import com.obelisco.modelo.data.Usuario;

public class UsuarioDAO extends HibernateDAO<Usuario> implements IUsuarioDAO {

	@Override
	public Usuario findByPK(Serializable clave) {
		Usuario data = (Usuario)getSession().load(Usuario.class, clave);
		return data.getEstado().equals("B") ?  null : data;
	}

	@Override
	public List<Usuario> loadAll() {
		return find("from Usuario usuario where usuario.estado != 'B'");
	}

	@Override
	public void delete(Usuario usuario) {
		if (usuario.getDeSistema().booleanValue())
			throw new ObeliscoException("NO se puede eliminar un Usuario de Sistema");
		getHibernateTemplate().delete(usuario);
	}

	ClassValidator<Usuario> usuarioValidator =
		new ClassValidator<Usuario>(Usuario.class,ResourceBundle.getBundle("com.obelisco.modelo.data.hibernate-validator"));
	
	public void validate(Usuario objeto) {
		InvalidValue[] validationMessages =  usuarioValidator.getInvalidValues(objeto);

		StringBuffer errores = new StringBuffer();
		for (int i = 0; i < validationMessages.length; i++) {
			InvalidValue value = validationMessages[i];
			errores.append(value.getPropertyName() + " - "+ value.getMessage() + "<br/>");
		}

		if (errores.length() > 0)
			throw new ObeliscoException(errores.toString());
	}

	@Override
	public void save(Usuario objeto) {		
		validate(objeto);
		saveOrUpdate(objeto);
	}

	@Override
	public List<Usuario> findByProperty(String nombre, Object valor) {
		String queryString = "from Usuario as modelo where modelo."
				+ nombre + "= ?";
		return find(queryString, valor);
	}

}
